package com.practice.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * volatile关键字只能保证变量的原子性，不能保证对变量的操作是原子性的
 */
public class VolatileAtomicityDemo {
    public volatile static int inc = 0;

    public void increase(){
        //这个操作并非原子的，分为三步，读取inc，对inc+1，将inc写回主存
        inc++;
    }


    public static void main(String[] args) throws InterruptedException {
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        VolatileAtomicityDemo volatileAtomicityDemo = new VolatileAtomicityDemo();
        for(int i=0;i<5;i++){
            threadPool.execute(()->{
                for(int j=0;j<500;j++){
                    volatileAtomicityDemo.increase();
                }
            });
        }
        //等待1.5s，保证上面程序完成
        Thread.sleep(1500);
        //这里极大概率小于2500，原因在于inc只是可见的，即每次读取会从主存中，但对其进行inc++操作并不限制原子性
        //要保证2500，只需对increase方法加锁即可
        System.out.println(inc);
        threadPool.shutdown();
    }
}
